package simple.number;

/**
 * <a href="https://leetcode.cn/problems/number-of-days-between-two-dates/">1360. 日期之间隔几天</a>
 * 请你编写一个程序来计算两个日期之间隔了多少天。
 * 日期以字符串形式给出，格式为 YYYY-MM-DD，如示例所示。
 * 示例 1：
 *   输入：date1 = "2019-06-29", date2 = "2019-06-30"
 *   输出：1
 * 示例 2：
 *   输入：date1 = "2020-01-15", date2 = "2019-12-31"
 *   输出：15
 * 提示：
 *   给定的日期是 1971 年到 2100 年之间的有效日期。
 * @author 刘学松
 * @date 2023-08-03 9:24
 */
public class 日期之间隔几天 {
    int[] daysMap2 = new int[] {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
    public int daysBetweenDates(String date1, String date2) {
        int year1 = Integer.parseInt(date1.substring(0, 4));
        int year2 = Integer.parseInt(date2.substring(0, 4));
        int month1 = Integer.parseInt(date1.substring(5, 7))-1;
        int month2 = Integer.parseInt(date2.substring(5, 7))-1;
        int day1 = Integer.parseInt(date1.substring(8, 10));
        int day2 = Integer.parseInt(date2.substring(8, 10));

        return Math.abs(getDays(year1, month1, day1)-getDays(year2, month2, day2));
    }

    public int getDays(int year, int month, int days) {
        int runs = (year >> 2) - year / 100 + year / 400;
        if (month < 2 && year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) {
            runs -= 1;
        }
        return year * 356 + daysMap2[month] + days + runs;
    }
}
